#ifndef LOG_H
#define LOG_H

#include <Arduino.h>
//#include "os_sprintf.h"
#include "mbed_printf_implementation.h"

#define NDEBUG 
#   ifndef __LONG_MAX__
#    if defined (__alpha__) || (defined (__sparc__) && defined(__arch64__)) || defined (__sparcv9)
#     define __LONG_MAX__ 9223372036854775807L
#    else
#     define __LONG_MAX__ 2147483647L
#    endif /* __alpha__ || sparc64 */
#   endif
#   undef LONG_MIN
#   define LONG_MIN (-LONG_MAX-1)
#   undef LONG_MAX
//#   define LONG_MAX __LONG_MAX__
#   define LONG_MAX __INT_MAX__
//#define LONG_MIN (-LONG_MAX - 1L)

struct log{
#ifdef MBED_PRINTF_IMPLEMENTATION_H
static void debug(const char* format,...)__attribute__ ((noinline)) 
{
    #ifndef NDEBUG
    //static FILE f;
    {
    va_list arguments;
    va_start(arguments, format);
    mbed_minimal_formatted_string(NULL, LONG_MAX, format, arguments, stdout);
    va_end(arguments);
    }
    #endif
}


// void printf(const char* format,...);

// static log& instance()
// {
//     static log log;
//     return log;
// }
#else

#ifndef NDEBUG
struct log_buf
{
    char* buffer[0];
};
static void out(char character, void* buffer, unsigned int idx, unsigned int maxlen)
{
    Serial.print(character);
}
#endif
static void debug(const char* format,...)
{
    #ifndef NDEBUG
    static log_buf buf;
    va_list arguments;
    va_start(arguments, format);
    os_vsnprintf(out,buf.buffer,255,fmt, args);
    va_end(arguments);
    #endif
}
#endif

};

#endif